java中List元素移除元素的那些坑(上) |
您所在的位置:网站首页 › list 移除元素 › java中List元素移除元素的那些坑(上) |
一、问题案例 1.1、for循环移除 public static void main(String[] args) { List list = new ArrayList(); list.add("11"); list.add("11"); list.add("12"); list.add("13"); list.add("14"); list.add("15"); list.add("16"); System.out.println("原始list元素:"+ list.toString()); CopyOnWriteArrayList copyList = new CopyOnWriteArrayList(list); //通过下表移除等于11的元素 for (int i = 0; i < list.size(); i++) { String item = list.get(i); if("11".equals(item)) { list.remove(i); } } System.out.println("通过下表移除后的list元素:"+ list.toString()); //通过对象移除等于11的元素 for (int i = 0; i < copyList.size(); i++) { String item = copyList.get(i); if("11".equals(item)) { copyList.remove(item); } } System.out.println("通过对象移除后的list元素:"+ list.toString()); }输出结果: 原始list元素:[11, 11, 12, 13, 14, 15, 16] 通过下表移除后的list元素:[11, 12, 13, 14, 15, 16] 通过对象移除后的list元素:[11, 12, 13, 14, 15, 16]有没有发现有蹊跷的地方? 从输出结果可以看的出,移除后的元素,并没有把内容为 11 的都移除掉! 发生了什么? 删除了第一个 11 后,集合里的元素个数减1,后面的元素往前移了1位,此时,第二个 11 已经移到了索引 index=1的位置,而此时i马上i++了,list.get(i)获得的是数据 12 。同时 list.size() 的值也在减小。所以最后输出那个结果。 public static void main(String[] args) { List list = new ArrayList(); list.add("11"); list.add("11"); list.add("12"); list.add("13"); list.add("14"); list.add("15"); list.add("16"); System.out.println("原始list元素:"+ list.toString()); //通过对象移除等于11的元素 for (String item : list) { if("11".equals(item)) { list.remove(item); } } System.out.println("通过对象移除后的list元素:"+ list.toString()); }输出结果: 抛ConcurrentModificationException异常! foreach 写法实际上是对的 Iterable 、hasNext 、next 方法的简写。因此我们从List.iterator() 着手分析,跟踪 iterator() 方法,该方法返回了 Itr 迭代器对象。 找到 List 的迭代器类 public Iterator iterator() { return new Itr(); }Itr 对象 private class Itr implements Iterator { int cursor; // index of next element to return int lastRet = -1; // index of last element returned; -1 if no such int expectedModCount = modCount; Itr() {} public boolean hasNext() { return cursor != size; } @SuppressWarnings("unchecked") public E next() { checkForComodification(); int i = cursor; if (i >= size) throw new NoSuchElementException(); Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) throw new ConcurrentModificationException(); cursor = i + 1; return (E) elementData[lastRet = i]; } public void remove() { if (lastRet < 0) throw new IllegalStateException(); checkForComodification(); try { ArrayList.this.remove(lastRet); cursor = lastRet; lastRet = -1; expectedModCount = modCount; } catch (IndexOutOfBoundsException ex) { throw new ConcurrentModificationException(); } } @Override @SuppressWarnings("unchecked") public void forEachRemaining(Consumer |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |